#define  _CRT_SECURE_NO_WARNINGS 1
#include <iostream>

template<class T>
struct ListNode
{
	ListNode(const T& val = T())
		:_val(val),_prev(nullptr),_next(nullptr)
	{}

	T _val;
	ListNode<T>* _prev;
	ListNode<T>* _next;
};

template<class T>
class ListIterator
{
	typedef ListNode<T> Node;
	typedef ListIterator<T> Self;
public:
	ListIterator(Node* ptr)
		:_ptr(ptr)
	{}
	
	ListIterator(const Self& s)
		:_ptr(s._ptr)
	{}

	bool operator!=(const Self& s)
	{
		return _ptr != s._ptr;
	}

	bool operator==(const Self& s)
	{
		return _ptr == s._ptr;
	}

	T* operator->()
	{
		return &_ptr->_val;
	}

	T& operator*()
	{
		return _ptr->_val;
	}
	//++it
	Self& operator++()
	{
		_ptr = _ptr->_next;
		return *this;
	}
	//it++
	Self operator++(int)
	{
		Self tmp(*this);
		_ptr = _ptr->_next;
		return tmp;
	}
	//--it
	Self& operator--()
	{
		_ptr = _ptr->_prev;
		return *this;
	}
	//it--
	Self operator--(int)
	{
		Self tmp(*this);
		_ptr = _ptr->_prev;
		return tmp;
	}
private:
	Node* _ptr;
};

template<class T>
class List
{
	typedef ListNode<T> Node;
	typedef ListIterator<T> iterator;
public:
	typedef ListIterator<T> iterator;	
	List()
	{}

private:
	Node* _head;
	size_t _size;
};




